package com.ndk.push;

import android.app.Activity;
import android.view.SurfaceHolder;

/**
 * 中转站，和Native层打交道
 */
public class NdkPusher {

    static {
        System.loadLibrary("native-lib");
    }

    private VideoChannel mVideoChannel; // 视频通道
    private AudioChannel mAudioChannel; // 音频通道

    /**
     * 此中转站的构造，主要是的三件事，
     * ①:初始化native层需要的加载，
     * ②:实例化视频通道并传递基本参数(宽高,fps,码率等)，
     * ③:实例化音频通道
     */
    public NdkPusher(Activity activity, int cameraId, int width, int height, int fps, int bitrate) {
        native_init();
        // 将this传递给VideoChannel，方便VideoChannel操控native层
        mVideoChannel = new VideoChannel(this, activity, cameraId, width, height, fps, bitrate);
        mAudioChannel = new AudioChannel(this);
    }

    // 视频通道-->SurfaceView与中转站里面的Camera绑定，视频独有的，音频没有
    public void setPreviewDisplay(SurfaceHolder surfaceHolder) {
        mVideoChannel.setPreviewDisplay(surfaceHolder);
    }

    // 视频通道-->切换摄像头，视频独有的，音频没有
    public void switchCamera() {
        mVideoChannel.switchCamera();
    }

    /**
     * 开始直播
     *
     * @param path rtmp地址
     */
    public void startLive(String path) {
        native_start(path);
        mVideoChannel.startLive();
        mAudioChannel.startLive();
    }

    /**
     * 停止直播
     */
    public void stopLive() {
        mVideoChannel.stopLive();
        mAudioChannel.stopLive();
        native_stop();
    }

    /**
     * 释放工作
     */
    public void release() {
        mVideoChannel.release();
        mAudioChannel.release(); // audioRecord释放工作
        native_release();
    }

    // 音频通道需要样本数（faac的编码器，输出样本 的样本数，才是标准）
    public int getInputSamples() {
        return native_getInputSamples(); // native层-->从faacEncOpen中获取到的样本数
    }

    // native函数 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    // 音频 视频 公用的
    private native void native_init(); // 初始化
    private native void native_start(String path); // 开始直播start(音频视频通用一套代码) path:rtmp推流地址
    private native void native_stop(); // 停止直播
    private native void native_release(); // onDestroy--->release释放工作

    // 下面是视频独有
    public native void native_initVideoEncoder(int width, int height, int mFps, int bitrate); // 初始化x264编码器
    public native void native_pushVideo(byte[] data); // 相机画面的数据 byte[] 推给 native层

    // 下面是音频独有
    public native void native_initAudioEncoder(int sampleRate, int numChannels); // 初始化faac音频编码器
    public native int native_getInputSamples(); // 获取faac编码器 样本数
    public native void native_pushAudio(byte[] bytes); // 把audioRecord采集的原始数据，给native层 编码-->入队---> 发给流媒体服务器
}
